class Solution
{
public:
  ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
  {
    // 1. 借助【临时节点】当做【头节点】，但最终返回 result.next 开始的链表
    ListNode result(-1);
    ListNode* p = &result;

    // 2. l1 和 类l2 都存在
    while (l1 && l2)
    {
      // p->next 指向 max(l1, l2)，l1 和 l2 分别【往后】移动
      if (l1->val <= l2->val)
      {
        p->next = l1; // 将 l1 插入到最终的【有序】链表的尾部
        l1 = l1->next; // l1 往后移
      }
      else
      {
        p->next = l2; // 同时
        l2 = l2->next; // 同上
      }

      // 指向 min(l1, l2) 插入的【最后】一个节点
      p = p->next;
    }

    // 3. l1 和 l2 有一方已经为 NULL
    // l1 和 l2 剩下的 子链表节点，直接插入到【有序】链表的【尾部】
    p->next = l1 != nullptr ? l1 : l2;

    // 4. result 是一个【临时】节点，他后面的第一个节点，才是真正的原有链表节点
    return result.next;
  }
};
